Необходимые библиотеки:

library(dplyr)
library(ggplot2)
library(PerformanceAnalytics)
library(RColorBrewer)
library(corrplot)
library(Hmisc)
library(heatmaply)

Данные

Данные содержат некоторые индивидуальные характеристики студентов и результаты их успеваемости по курсу.

Переменные


Считываем данные

data <- read.csv("data.csv")
head(data)

Посмотрим на данные

Необходимо помнить два важных допущения для построения корреляции Пирсона:

Посмотрим, как распределены некоторые переменные с помощью диаграммы частот. И проверим нормальность распределения с помощью теста Шапиро-Уилка.

hist(data$grade, breaks = 20, col = "lightblue")

shapiro.test(data$grade)
## 
##  Shapiro-Wilk normality test
## 
## data:  data$grade
## W = 0.99704, p-value = 0.5028

Диаграмма показывает, что условие нормальности распределения выполняется. p-value = 0.5028, т.е. p-value > 0.05. Соответственно, гипотеза о нормальности распределения не отвергается.

hist(data$number_lectures, breaks = 20, col = "lightblue")

shapiro.test(data$number_lectures)
## 
##  Shapiro-Wilk normality test
## 
## data:  data$number_lectures
## W = 0.99344, p-value = 0.02855

Диаграмма показывает, что условие нормальности распределения не выполняется. p-value = 0.02855, т.е. p-value < 0.05. Соответственно, гипотеза о нормальности распределения отвергается.

hist(data$age, breaks = 20, col = "lightblue")

shapiro.test(data$age)
## 
##  Shapiro-Wilk normality test
## 
## data:  data$age
## W = 0.94904, p-value = 4.222e-12

Диаграмма показывает, что условие нормальности распределения не выполняется. p-value = 4.222e-12, т.е. p-value < 0.05. Соответственно, гипотеза о нормальности распределения отвергается.

Построим корреляцию на двух переменных

Визуализация

Диаграмма рассеяния (scatterplot)

plot(data$number_lectures, 
     data$grade, 
     type = "p",
     main = "A Scatterplot of X and Y",
     xlab = "Количество просмотренных лекций",
     ylab = "Оценка за курс",
     col = "steelblue",
     pch = 19)

ИЛИ

ggplot(data, aes(x = number_lectures, y = grade)) + 
    geom_point(color="#69b3a2") +
  xlab("Количество просмотренных лекций") +
  ylab("Оценка за курс")

Добавляем линию тренда

ggplot(data, aes(x = number_lectures, y = grade)) +
  geom_point(color="#69b3a2") +
  xlab("Количество просмотренных лекций") +
  ylab("Оценка за курс") +
  geom_smooth(method = lm, color = "red", se = FALSE)
## `geom_smooth()` using formula 'y ~ x'

Расчет коэффициента корреляции

В R коэффициент корреляции Пирсона можно легко рассчитать с помощью функциий cor() и cor.test(). Различие между данными функциями состоит в том, что cor() позволяет расчитать только коэффициент корреляции, а cor.test() помимо расчета самого коэффициента также выводит статистическую значимость коэффициента.

Функция cor(X, Y)

Функция cor.test(X, Y)

Поскольку в нашем случае не выполняется условие нормальности распределения для обеих переменных, необходимо использовать непараметрический коэффициент корреляции Спирмена. Для вычисления коэффициента корреляции Спирмена в R также используется функция cor.test(). Однако, по умолчанию данная функция расчитывает коэффициент корреляции Пирсона. Чтобы расчитать коэффициент корреляции Спирмена необходимо установить значение “spearman” в аргументе method:

cor.test(data$grade, data$number_lectures, method = "spearman")
## Warning in cor.test.default(data$grade, data$number_lectures, method =
## "spearman"): Cannot compute exact p-value with ties
## 
##  Spearman's rank correlation rho
## 
## data:  data$grade and data$number_lectures
## S = 3376789, p-value < 2.2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
##       rho 
## 0.8379135

Коэффициент корреляции Спирмена равен 0.838, что указывает на сильную положительную корреляцию между количеством проссмотренных студентом лекций и его оценкой за курс.

cor.test(data$grade, data$age, method = "spearman")
## Warning in cor.test.default(data$grade, data$age, method = "spearman"): Cannot
## compute exact p-value with ties
## 
##  Spearman's rank correlation rho
## 
## data:  data$grade and data$age
## S = 20047661, p-value = 0.4001
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
##        rho 
## 0.03770844

Коэффициент корреляции Спирмена равен 0.038, что указывает на достаточно слабую отрицательную корреляцию.

Корреляционная матрица

Визуализация

  1. Базовая матрица диаграмм рассеяния (Scatterplot Matrix)
pairs( ~ age + grade + number_lectures + number_pauses, data = data,
       main="Scatterplot Matrix")

Построение матрицы

data_1 <- data[,c(4,5,6,7,8)]
cor(data_1)
##                                    age      grade number_lectures
## age                         1.00000000 0.04165184      0.01268095
## grade                       0.04165184 1.00000000      0.85503913
## number_lectures             0.01268095 0.85503913      1.00000000
## number_supplement_materials 0.07547857 0.76242464      0.64320993
## number_forum_posts          0.02393370 0.71722348      0.62104083
##                             number_supplement_materials number_forum_posts
## age                                          0.07547857          0.0239337
## grade                                        0.76242464          0.7172235
## number_lectures                              0.64320993          0.6210408
## number_supplement_materials                  1.00000000          0.5593784
## number_forum_posts                           0.55937840          1.0000000

Другие варианты визуализации

  1. heatmap
heatmaply_cor(
  cor(data_1),
  k_col = 2, 
  k_row = 2
)
## Warning in doTryCatch(return(expr), name, parentenv, handler): не могу загрузить разделяемый объект '/Library/Frameworks/R.framework/Resources/modules//R_X11.so':
##   dlopen(/Library/Frameworks/R.framework/Resources/modules//R_X11.so, 6): Library not loaded: /opt/X11/lib/libSM.6.dylib
##   Referenced from: /Library/Frameworks/R.framework/Versions/3.6/Resources/modules/R_X11.so
##   Reason: image not found
  1. corrplot
data_2 <- cor(data_1, method = "spearman")
corrplot(data_2, method = "circle")

data_2 <- cor(data_1, method = "spearman")
corrplot(data_2, method = "number")

  1. chart.Correlation
chart.Correlation(data_1, histogram=TRUE, pch=19)

Домашняя работа

Попробуйте построить рассчитать корреляцию между переменными

  1. Выберете 2 заинтересовавшие Вас переменные

  2. Постройте корреляцию (график и коэффициент)

  3. Проинтерпретируйте результат

  4. Отберите несколько заинтересовавших Вас переменных в новый датафрейм

  5. Постройте корреляционную матрицу любым способом

  6. Визуализируйте матрицу любыми 2-мя способами